package com.itheima.api.generic.demo07;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型通配符的使用
 */
public class GenericDemo01 {

    public static void main(String[] args) {

        // 创建一个ArrayList集合对象
        ArrayList<Animal> animals = new ArrayList<Animal>() ;
        show(animals);
        function(animals);
        method(animals);

        System.out.println("----------------------------------");

        // 创建一个ArrayList集合对象
        ArrayList<Cat> arrayList = new ArrayList<>() ;
        show(arrayList);
        function(arrayList);
        // method(arrayList);   // Cat是Animal的子类

        // 创建一个ArrayList集合对象
        ArrayList<Object> objects = new ArrayList<Object>() ;
        // function(objects);
        method(objects);


    }

    /**
     * <? super E>   :   类型通配符下限，表示元素可以是E或者E的父类
     * 在调用这个method方法的时候需要给我传递一个集合对象，这个集合对象的元素类型可以是Animal或者是Animal的父类
     */
    public static void method(List<? super Animal> list) {
        list.forEach( s -> {
            System.out.println(s);
        });
    }

    /**
     * 在调用我们的这个show方法的时候，你需要给我传的一个List这个接口的子类对象，这个集合中的元素类型
     * 可以是Animal也可以是Animal的子类
     */
    public static void function(List<? extends Animal> list) {
        list.forEach( s -> {
            System.out.println(s);
        });
    }

    /**
     * 定义了一个show方法，show方法上需要一个集合类型的参数，这个集合类型中的元素可以是任意类型
     * @param list
     */
    public static void show(List<?> list) {
        list.forEach(s -> {
            System.out.println(s);
        });
    }

}
